package com.abner.design.patterns.singleton;

/**
 * 静态内部类
 * @Author: abner
 * @Date: 2022-04-22-17:30
 **/
public class SingletonType6 {

    public static void main(String[] args) {
        Singleton6 instance1 = Singleton6.getInstance6();
        Singleton6 instance2 = Singleton6.getInstance6();
        System.out.println(instance1 == instance2);
        System.out.println(instance1.hashCode() == instance2.hashCode());
    }
}

/**
 * 优缺点:
 *  1) 这种方式采用了类装载的机制来保证初始化实例时只有一个线程。
 *  2) 静态内部类方式在 Singleton 类被装载时并不会立即实例化，而是在需要实例化时，调用 getInstance 方法，才会装载 SingletonInstance 类，从而完成 Singleton 的实例化。
 *  3) 类的静态属性只会在第一次加载类的时候初始化，所以在这里，JVM 帮助我们保证了线程的安全性，在类进行初始化时，别的线程是无法进入的。
 *  4) 优点：避免了线程不安全，利用静态内部类特点实现延迟加载，效率高
 *  5) 结论：推荐使用.
 */
class Singleton6 {

    private Singleton6() {};

    private static class SingletonInstance{
          private static final Singleton6 INSTANCE = new Singleton6();
    }

    public static Singleton6 getInstance6() {
        return SingletonInstance.INSTANCE;
    }
}